package com.asambleacristiana.utils;

import java.util.Calendar;
import java.util.Date;

public class FechaUtils {

	public static boolean isFechaValida(Date fechaInput) {
		Date input = getOnlyMinimalDate(fechaInput);
		Date hoy = getOnlyMinimalDate(new Date());
		Date fechaLimiteMesActual = fechaLimite(getUltimoDiaDelMesActual());
		Date fechaLimiteMesAnteriorAlActual = fechaLimite(getUltimoDiaPermitidoMesAnterior());
		// el primer caso evalua si esta en fecha 
		return (input.compareTo(getPrimerDiaDelMesActual()) >= 0 && input.compareTo(fechaLimiteMesActual) < 0) || 
				//el segundo si, quiere colocar una fecha de un mes anterior al actual y cuya fecha es menor al ultima dia permitido del mes anterior
				(input.compareTo(getPrimerDiaPermitidoMesAnterior()) >=0 &&  hoy.compareTo(fechaLimiteMesAnteriorAlActual) < 0)  ; 
		
	}


	public static Date getUltimoDiaDelMesActual() {
		Calendar calendar = Calendar.getInstance();
		calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
		return getOnlyMinimalDate(calendar.getTime());
	}
	
	public static Date getUltimoDiaPermitidoMesAnterior() {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(getPrimerDiaDelMesActual());
		calendar.add(Calendar.MONTH, -1);
		calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
		return getOnlyMinimalDate(calendar.getTime());
	}
	
	
	public static Date getPrimerDiaDelMesActual() {
		Calendar calendar = Calendar.getInstance();
		calendar.set(Calendar.DAY_OF_MONTH, 1);
		return  getOnlyMinimalDate(calendar.getTime());
	}

	
	public static Date getPrimerDiaPermitidoMesAnterior() {
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.MONTH, -1);
		calendar.set(Calendar.DAY_OF_MONTH,1);
		return getOnlyMinimalDate(calendar.getTime());
	}
	
	private static Date getOnlyMinimalDate(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.set(Calendar.HOUR_OF_DAY, 0);
		calendar.set(Calendar.MINUTE, 0);
		calendar.set(Calendar.SECOND, 0);
		calendar.set(Calendar.MILLISECOND, 0);
		return calendar.getTime();
	}

	private static Date fechaLimite(Date date) {
		long currentMilis = date.getTime();
		int milisegundosEnDosSemana = 1000 * 60 * 60 * 24 * 15;
		return new Date(currentMilis + milisegundosEnDosSemana);
	}

	public static Date getPrimerDiaDelMes(int mes) {
		Calendar cal = Calendar.getInstance();
		int anio = cal.get(Calendar.YEAR);
		cal.clear();
		cal.set(Calendar.MONTH, mes);
		cal.set(anio,cal.get(Calendar.MONTH), cal.getActualMinimum(Calendar.DAY_OF_MONTH));
		return cal.getTime();
	}

	public static Date getUltimoDiaDelMes(int mes) {
		Calendar cal = Calendar.getInstance();
		int anio = cal.get(Calendar.YEAR);
		cal.clear();
		cal.set(Calendar.MONTH, mes);
		cal.set(anio,cal.get(Calendar.MONTH), cal.getActualMaximum(Calendar.DAY_OF_MONTH));
		return cal.getTime();
	}

	public static Date getUltimoDiaDelMes(int anio, int mes) {
		Calendar cal = Calendar.getInstance();
		cal.clear();
		cal.set(Calendar.YEAR, anio);
		cal.set(Calendar.MONTH, mes);
		cal.set(anio,cal.get(Calendar.MONTH), cal.getActualMaximum(Calendar.DAY_OF_MONTH));
		return cal.getTime();
	}

	public static Date getPrimerDiaDelMes(int anio, int mes) {
		Calendar cal = Calendar.getInstance();
		cal.clear();
		cal.set(Calendar.YEAR, anio);
		cal.set(Calendar.MONTH, mes);
		cal.set(anio,cal.get(Calendar.MONTH), cal.getActualMinimum(Calendar.DAY_OF_MONTH));
		return cal.getTime();
	}
	
}
